module.exports = {

	// 封装push方法 --发送通知消息
	/**
	 * @param {object} param
	 * @param {string || array} appId
	 */
	sendPushMsg: async (param = {}, appId = '') => {
		let pushParam = {
			// 验证token是否有效，无效则不向此设备推送消息
			// check_token: true,
			settings: {
				//-1表示不设离线，因为离线后重新打开数据统一从数据库中拉取。否则会重复
				ttl: -1
			},
			// 离线推送厂商信息配置，需要到云厂商后台申请
			channel: {
				// 华为离线推送
				"HW": "NORMAL",
				// 小米离线推送
				"XM": "high_system"
			}
		}
		/**
		 * 如果不指定接收消息的客户端appid，则指定为消息推送者的客户端appid。
		 * 用于两个客户端appid不同的场景，比如电商项目，商家和普通用户端appid不同
		 */
		// if (!appId) {
		// 	appId = this.clientInfo.appId
		// 	if (!appId) {
		// 		throw new Error('appId is not definded')
		// 	}
		// }
		pushParam = Object.assign(pushParam, param)

		// 如果是im通知消息（比如：加好友申请，用户请求加群，用户退群等），则记录到数据表uni-im-notification中
		if (param.payload.type == "uni-im-notification" || param.payload.type ==
			"woomaga-notification") {
			//从参数中解构出需要的变量
			let {
				title,
				content,
				payload,
				sound,
				open_url,
				path,
				user_id
			} = pushParam
			//生成推送数据
			let notificationContent = {
				title,
				content,
				payload,
				sound,
				open_url,
				path
			}
			notificationContent.is_read = false
			notificationContent.create_time = Date.now()
			let notificationData;
			// 如果接收消息的用户量不止一个，则需要插入数据表的记录为多条（数组）
			// 对应每个user，分别多个数据对象，user_id不同其他相同
			// 如果不是数组则只有一条数据
			if (Array.isArray(user_id)) {
				notificationData = user_id.map(uid => {
					return {
						user_id: uid,
						...notificationContent
					}
				})
			} else {
				notificationData = Object.assign(notificationContent, {
					user_id
				})
			}
			// 执行写入到数据库
			// let uinRes = await db.collection('uni-im-notification').add(notificationData)
			// param.payload.notificationId = uinRes.id
		}
		// 调用unipush API 完成信息发送   appId 应该可以是数组(待测试) __WJF
		let res = await uniCloud.getPushManager({
			appId
		}).sendMessage(pushParam)
		if (res.errCode) {
			if (res.errCode == "uni-push-user-invalid") {
				//可能因为用户长时间没有登录导致的cid过期而发送失败，但是此时已将离线数据写入数据库，登录后可获取。客户端不需要进入 catch
				res = {
					data: {
						"uni-push-err-res": res
					},
					errCode: 0
				}
			} else {
				console.log(res.errCode);
				throw new Error(res.errMsg)
			}
		}
		return res
	}
	/*  this.sendPushMsg End  */
}